Skip to content

Feat/improve apis - #48

Merged
rracariu merged 9 commits into
masterfrom
feat/improve-apis
Sep 10, 2026
Merged

Feat/improve apis#48
rracariu merged 9 commits into
masterfrom
feat/improve-apis

Conversation

@rracariu

@rracariu rracariu commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

No description provided.

Radu Racariu added 3 commits September 8, 2026 14:35
Applies the same private-field + Box<str> + accessor treatment used
previously for Ref/XStr to the remaining scalar value types that held
a public String field: Str, Symbol, Uri.

- Str/Symbol/Uri: value field changed from `pub value: String` to a
  private `value: Box<str>`, with a new `value(&self) -> &str`
  accessor on all three (Str additionally keeps its pre-existing
  as_str()/Deref<Target=str>/AsRef<str>).
- Updated every direct field-access/struct-literal-construction call
  site across c_api, defs, json/brio/zinc/trio encode+decode, filter,
  dict.rs/dis_macro.rs, and tests to use the new accessor/constructors.
- Fixed one doctest and one PartialEq impl pair (Str vs str/String)
  that needed adjusting for the new Box<str> field type.

Verified via a throwaway size-probe test: Str/Symbol/Uri 24 -> 16
bytes each; Value stays at 40 bytes (Dict/Ref/XStr remain the tied
largest variants at 32B).

cargo build --all-targets, cargo test --all-targets (816 tests),
cargo test --doc (131), and cargo clippy --all-targets all clean.
Str's Display impl goes through the generic write!/format_args!
machinery. Since Str just wraps a Box<str>, add an inherent
to_string() that derefs to &str first and delegates to str's own
specialized ToString impl (a direct byte copy via String::from),
which the blanket ToString impl for Box<str> does not get (that
specialization only applies to str/String/char/Cow<str>, not Box<str>
itself).

The inherent method intentionally shadows ToString::to_string (same
output, verified by a new test), so
clippy::inherent_to_string_shadow_display is allowed with a comment.

Also routes the existing TryFrom<&Value> for String impl through it
for consistency.
@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown

Coverage after merging feat/improve-apis into master will be

82.31%

Coverage Report for Changed Files
FileStmtsBranchesFuncsLinesUncovered Lines
src/c_api
   str.rs0%100%0%0%35–39, 41, 43–44, 69–74, 76, 78, 80–81, 89, 92–93
   symbol.rs0%100%0%0%35–39, 41, 43–44, 68–73, 75, 77, 79–80
   uri.rs0%100%0%0%35–39, 41, 43–44, 69–74, 76, 78, 80–81
src/haystack/defs
   containment_refs.rs94.19%100%93.10%94.34%103, 121, 146–147, 224, 248, 265, 284, 313, 98
   misc.rs0%100%0%0%17–28
   namespace.rs92.83%100%98.94%91.79%239, 256, 334, 353, 386, 399, 411, 413, 415, 430, 485, 536, 678, 683, 686, 721, 737–756, 785, 790, 883, 904
src/haystack/encoding/brio
   decode.rs90.84%100%90.72%90.86%162–164, 180, 203, 254, 268–270, 274, 284–286, 295–297, 301, 309–311, 320–322, 327, 34–35, 352–354, 36, 369, 37, 383–389, 39, 391, 395–401, 403, 407–412, 414, 45–47, 49, 499–501, 51
   encode.rs98.40%100%97.37%98.54%462, 60–62, 64, 70–72
src/haystack/encoding/json
   decode.rs74.35%100%64.86%75.65%109–111, 124–144, 204, 21–24, 26, 276, 279, 28, 315, 325, 338, 345, 35, 355, 36, 363, 37–38, 382, 40, 416, 42, 422, 424, 433, 47–50, 52, 54, 65–68, 70, 89–92, 94
   encode.rs88.52%100%90%88.34%164–166, 168–169, 171–174, 22–23, 239, 24–29, 98
src/haystack/encoding/trio
   decode.rs96.12%100%95.89%96.16%119, 164–165, 17–19, 210–214, 247, 420, 794, 799
   encode.rs95.40%100%93.33%95.69%73–75, 88–93
src/haystack/encoding/zinc
   encode.rs87.02%100%83.33%87.50%142, 144–145, 147, 149, 182, 237, 240–241, 243, 259, 287, 404, 68–70, 72, 78–80, 84–86, 90–92, 96–98
src/haystack/encoding/zinc/decode
   value.rs100%100%100%100%
src/haystack/encoding/zinc/decode/complex
   grid.rs93.68%100%92.59%93.75%166, 181, 184–185, 192–194, 216–217, 225–227, 292–295, 337, 531, 570, 604
src/haystack/encoding/zinc/decode/scalar
   reference.rs100%100%100%100%
   str.rs90.63%100%100%89.89%47, 51–52, 55, 68–69, 77–78, 81
   symbol.rs96.55%100%100%96.15%26
   uri.rs96.30%100%100%96.08%35–36
src/haystack/filter
   nodes.rs82.14%100%89.19%80.75%126, 153–155, 205, 323–325, 335, 337, 340, 342, 344–351, 353, 355, 357–360, 362, 366–367, 377–379, 420–422
src/haystack/timezone
   iana.rs52%100%51.28%52.21%100–101, 104–106, 109–111, 114–116, 120–122, 126, 128–129, 131, 134, 136–137, 139, 142–144, 150–152, 159–162, 167–170, 175–177, 201–203, 207–209, 213–215, 223–224, 227, 239, 33–35, 84–86, 89–91, 94–96, 99
src/haystack/val
   dict.rs92.46%100%92.80%92.39%236–238, 316–318, 325–327, 404–406, 408–410, 412–414, 515–517, 533, 540–542, 661, 694
   dis_macro.rs97.67%100%100%97.27%50–52
   string.rs97.37%100%100%96.61%109, 98
   symbol.rs97.06%100%100%96.30%71
   uri.rs96.67%100%100%95.83%69

@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown

Coverage after merging feat/improve-apis into master will be

82.31%

Coverage Report for Changed Files
FileStmtsBranchesFuncsLinesUncovered Lines
src/c_api
   str.rs0%100%0%0%35–39, 41, 43–44, 69–74, 76, 78, 80–81, 89, 92–93
   symbol.rs0%100%0%0%35–39, 41, 43–44, 68–73, 75, 77, 79–80
   uri.rs0%100%0%0%35–39, 41, 43–44, 69–74, 76, 78, 80–81
src/haystack/defs
   containment_refs.rs94.19%100%93.10%94.34%103, 121, 146–147, 224, 248, 265, 284, 313, 98
   misc.rs0%100%0%0%17–28
   namespace.rs92.83%100%98.94%91.79%239, 256, 334, 353, 386, 399, 411, 413, 415, 430, 485, 536, 678, 683, 686, 721, 737–756, 785, 790, 883, 904
src/haystack/encoding/brio
   decode.rs90.84%100%90.72%90.86%162–164, 180, 203, 254, 268–270, 274, 284–286, 295–297, 301, 309–311, 320–322, 327, 34–35, 352–354, 36, 369, 37, 383–389, 39, 391, 395–401, 403, 407–412, 414, 45–47, 49, 499–501, 51
   encode.rs98.40%100%97.37%98.54%462, 60–62, 64, 70–72
src/haystack/encoding/json
   decode.rs74.35%100%64.86%75.65%109–111, 124–144, 204, 21–24, 26, 276, 279, 28, 315, 325, 338, 345, 35, 355, 36, 363, 37–38, 382, 40, 416, 42, 422, 424, 433, 47–50, 52, 54, 65–68, 70, 89–92, 94
   encode.rs88.52%100%90%88.34%164–166, 168–169, 171–174, 22–23, 239, 24–29, 98
src/haystack/encoding/trio
   decode.rs96.12%100%95.89%96.16%119, 164–165, 17–19, 210–214, 247, 420, 794, 799
   encode.rs95.40%100%93.33%95.69%73–75, 88–93
src/haystack/encoding/zinc
   encode.rs87.02%100%83.33%87.50%142, 144–145, 147, 149, 182, 237, 240–241, 243, 259, 287, 404, 68–70, 72, 78–80, 84–86, 90–92, 96–98
src/haystack/encoding/zinc/decode
   value.rs100%100%100%100%
src/haystack/encoding/zinc/decode/complex
   grid.rs93.68%100%92.59%93.75%166, 181, 184–185, 192–194, 216–217, 225–227, 292–295, 337, 531, 570, 604
src/haystack/encoding/zinc/decode/scalar
   reference.rs100%100%100%100%
   str.rs90.63%100%100%89.89%47, 51–52, 55, 68–69, 77–78, 81
   symbol.rs96.55%100%100%96.15%26
   uri.rs96.30%100%100%96.08%35–36
src/haystack/filter
   nodes.rs82.14%100%89.19%80.75%126, 153–155, 205, 323–325, 335, 337, 340, 342, 344–351, 353, 355, 357–360, 362, 366–367, 377–379, 420–422
src/haystack/timezone
   iana.rs52%100%51.28%52.21%100–101, 104–106, 109–111, 114–116, 120–122, 126, 128–129, 131, 134, 136–137, 139, 142–144, 150–152, 159–162, 167–170, 175–177, 201–203, 207–209, 213–215, 223–224, 227, 239, 33–35, 84–86, 89–91, 94–96, 99
src/haystack/val
   dict.rs92.46%100%92.80%92.39%236–238, 316–318, 325–327, 404–406, 408–410, 412–414, 515–517, 533, 540–542, 661, 694
   dis_macro.rs97.67%100%100%97.27%50–52
   string.rs97.37%100%100%96.61%109, 98
   symbol.rs97.06%100%100%96.30%71
   uri.rs96.67%100%100%95.83%69

@github-actions

github-actions Bot commented Sep 9, 2026

Copy link
Copy Markdown

Coverage after merging feat/improve-apis into master will be

82.29%

Coverage Report for Changed Files
FileStmtsBranchesFuncsLinesUncovered Lines
src/c_api
   str.rs0%100%0%0%35–39, 41, 43–44, 69–74, 76, 78, 80–81, 89, 92–93
   symbol.rs0%100%0%0%35–39, 41, 43–44, 68–73, 75, 77, 79–80
   uri.rs0%100%0%0%35–39, 41, 43–44, 69–74, 76, 78, 80–81
src/haystack/defs
   containment_refs.rs94.19%100%93.10%94.34%103, 121, 146–147, 224, 248, 265, 284, 313, 98
   misc.rs0%100%0%0%17–28
   namespace.rs92.83%100%98.94%91.79%239, 256, 334, 353, 386, 399, 411, 413, 415, 430, 485, 536, 678, 683, 686, 721, 737–756, 785, 790, 883, 904
src/haystack/encoding/brio
   decode.rs90.84%100%90.72%90.86%162–164, 180, 203, 254, 268–270, 274, 284–286, 295–297, 301, 309–311, 320–322, 327, 34–35, 352–354, 36, 369, 37, 383–389, 39, 391, 395–401, 403, 407–412, 414, 45–47, 49, 499–501, 51
   encode.rs98.40%100%97.37%98.54%462, 60–62, 64, 70–72
src/haystack/encoding/json
   decode.rs74.35%100%64.86%75.65%109–111, 124–144, 204, 21–24, 26, 276, 279, 28, 315, 325, 338, 345, 35, 355, 36, 363, 37–38, 382, 40, 416, 42, 422, 424, 433, 47–50, 52, 54, 65–68, 70, 89–92, 94
   encode.rs88.52%100%90%88.34%164–166, 168–169, 171–174, 22–23, 239, 24–29, 98
src/haystack/encoding/trio
   decode.rs96.12%100%95.89%96.16%119, 164–165, 17–19, 210–214, 247, 420, 794, 799
   encode.rs95.40%100%93.33%95.69%73–75, 88–93
src/haystack/encoding/zinc
   encode.rs87.02%100%83.33%87.50%142, 144–145, 147, 149, 182, 237, 240–241, 243, 259, 287, 404, 68–70, 72, 78–80, 84–86, 90–92, 96–98
src/haystack/encoding/zinc/decode
   value.rs100%100%100%100%
src/haystack/encoding/zinc/decode/complex
   grid.rs93.68%100%92.59%93.75%166, 181, 184–185, 192–194, 216–217, 225–227, 292–295, 337, 531, 570, 604
src/haystack/encoding/zinc/decode/scalar
   reference.rs100%100%100%100%
   str.rs90.63%100%100%89.89%47, 51–52, 55, 68–69, 77–78, 81
   symbol.rs96.55%100%100%96.15%26
   uri.rs96.30%100%100%96.08%35–36
src/haystack/filter
   nodes.rs82.14%100%89.19%80.75%126, 153–155, 205, 323–325, 335, 337, 340, 342, 344–351, 353, 355, 357–360, 362, 366–367, 377–379, 420–422
src/haystack/timezone
   iana.rs52%100%51.28%52.21%100–101, 104–106, 109–111, 114–116, 120–122, 126, 128–129, 131, 134, 136–137, 139, 142–144, 150–152, 159–162, 167–170, 175–177, 201–203, 207–209, 213–215, 223–224, 227, 239, 33–35, 84–86, 89–91, 94–96, 99
src/haystack/val
   dict.rs92.46%100%92.80%92.39%236–238, 316–318, 325–327, 404–406, 408–410, 412–414, 515–517, 533, 540–542, 661, 694
   dis_macro.rs97.67%100%100%97.27%50–52
   reference.rs88.16%100%88.24%88.14%125–127, 136, 85–87
   string.rs97.37%100%100%96.61%109, 98
   symbol.rs97.06%100%100%96.30%71
   uri.rs96.67%100%100%95.83%69

Radu Racariu added 3 commits September 9, 2026 18:55
Lets consumers take ownership of the internal Box<str> directly
without going through a String round-trip.
…/Symbol/Ref, with tests

Mirrors the Str precedent from the previous commits:
- Uri/Symbol: into_inner(self) -> Box<str>, From<Box<str>>
- Ref: into_inner(self) -> (Box<str>, Option<Box<str>>), From<Box<str>> (dis: None)
- XStr: into_inner(self) -> (Box<str>, Box<str>) for (type, value); no From<Box<str>>
  since XStr requires two fields

Adds 8 new tests (329 total, up from 321) covering the new methods.
Validated with cargo build --all-targets, cargo test --all-targets,
cargo test --doc, and cargo clippy --all-targets (all clean).
@github-actions

Copy link
Copy Markdown

Coverage after merging feat/improve-apis into master will be

82.33%

Coverage Report for Changed Files
FileStmtsBranchesFuncsLinesUncovered Lines
src/c_api
   str.rs0%100%0%0%35–39, 41, 43–44, 69–74, 76, 78, 80–81, 89, 92–93
   symbol.rs0%100%0%0%35–39, 41, 43–44, 68–73, 75, 77, 79–80
   uri.rs0%100%0%0%35–39, 41, 43–44, 69–74, 76, 78, 80–81
src/haystack/defs
   containment_refs.rs94.19%100%93.10%94.34%103, 121, 146–147, 224, 248, 265, 284, 313, 98
   misc.rs0%100%0%0%17–28
   namespace.rs92.83%100%98.94%91.79%239, 256, 334, 353, 386, 399, 411, 413, 415, 430, 485, 536, 678, 683, 686, 721, 737–756, 785, 790, 883, 904
src/haystack/encoding/brio
   decode.rs90.84%100%90.72%90.86%162–164, 180, 203, 254, 268–270, 274, 284–286, 295–297, 301, 309–311, 320–322, 327, 34–35, 352–354, 36, 369, 37, 383–389, 39, 391, 395–401, 403, 407–412, 414, 45–47, 49, 499–501, 51
   encode.rs98.40%100%97.37%98.54%462, 60–62, 64, 70–72
src/haystack/encoding/json
   decode.rs74.35%100%64.86%75.65%109–111, 124–144, 204, 21–24, 26, 276, 279, 28, 315, 325, 338, 345, 35, 355, 36, 363, 37–38, 382, 40, 416, 42, 422, 424, 433, 47–50, 52, 54, 65–68, 70, 89–92, 94
   encode.rs88.52%100%90%88.34%164–166, 168–169, 171–174, 22–23, 239, 24–29, 98
src/haystack/encoding/trio
   decode.rs96.12%100%95.89%96.16%119, 164–165, 17–19, 210–214, 247, 420, 794, 799
   encode.rs95.40%100%93.33%95.69%73–75, 88–93
src/haystack/encoding/zinc
   encode.rs87.02%100%83.33%87.50%142, 144–145, 147, 149, 182, 237, 240–241, 243, 259, 287, 404, 68–70, 72, 78–80, 84–86, 90–92, 96–98
src/haystack/encoding/zinc/decode
   value.rs100%100%100%100%
src/haystack/encoding/zinc/decode/complex
   grid.rs93.68%100%92.59%93.75%166, 181, 184–185, 192–194, 216–217, 225–227, 292–295, 337, 531, 570, 604
src/haystack/encoding/zinc/decode/scalar
   reference.rs100%100%100%100%
   str.rs90.63%100%100%89.89%47, 51–52, 55, 68–69, 77–78, 81
   symbol.rs96.55%100%100%96.15%26
   uri.rs96.30%100%100%96.08%35–36
src/haystack/filter
   nodes.rs82.14%100%89.19%80.75%126, 153–155, 205, 323–325, 335, 337, 340, 342, 344–351, 353, 355, 357–360, 362, 366–367, 377–379, 420–422
src/haystack/timezone
   iana.rs52%100%51.28%52.21%100–101, 104–106, 109–111, 114–116, 120–122, 126, 128–129, 131, 134, 136–137, 139, 142–144, 150–152, 159–162, 167–170, 175–177, 201–203, 207–209, 213–215, 223–224, 227, 239, 33–35, 84–86, 89–91, 94–96, 99
src/haystack/val
   dict.rs92.46%100%92.80%92.39%236–238, 316–318, 325–327, 404–406, 408–410, 412–414, 515–517, 533, 540–542, 661, 694
   dis_macro.rs97.67%100%100%97.27%50–52
   reference.rs89.29%100%89.47%89.23%137–139, 148, 90–92
   string.rs97.62%100%100%96.92%110, 121
   symbol.rs97.62%100%100%96.97%83
   uri.rs97.37%100%100%96.67%81
   xstr.rs96.55%100%100%95.65%63

@rracariu
rracariu requested a review from garethj2 September 10, 2026 07:31
@rracariu rracariu self-assigned this Sep 10, 2026
…into_inner to into_parts

Several decode paths (zinc scalar, brio, trio, filter lexer) built a
Str/Uri/Symbol/Ref/XStr from a byte buffer or another owned String by
first borrowing it as &str (sometimes via from_utf8_lossy(..).into_owned(),
which always allocates even when the bytes are already valid UTF-8), even
though the source buffer/String was locally owned and about to be dropped.
Fixed by moving the owned data in directly:

- zinc scalar decoders (str/uri/symbol/reference/id): use
  String::from_utf8(buf) to reuse the already-owned buffer in the common
  valid-UTF8 case, falling back to from_utf8_lossy only on invalid input.
- zinc reference decoder: build via Ref::from(value) + set_dis(dis) instead
  of Ref::make(&str, Option<&str>), avoiding a clone of both the id and dis.
- zinc xstr decoder: use Str::into_inner() to move the parsed value's Box<str>
  straight into XStr::make instead of re-cloning via value.as_str().
- brio decoder: CTRL_STR/CTRL_SYMBOL now move the decoded String directly via
  From<String> instead of Value::from(&str)/Symbol::make(&str); CTRL_REF_STR/
  CTRL_REF_I8 use a new make_ref() helper built on Ref::from()+set_dis();
  CTRL_XSTR and decode_buf_as_xstr pass owned Strings directly.
- trio decoder: Str::from(lines.join("\n")) instead of Str::make(&lines.join(..)).
- filter lexer: Id gained a Box<str>-backed into_inner(); the Rel-symbol path
  uses Symbol::from(id.into_inner()) for a true zero-copy handoff instead of
  going through Display/to_string().

Widened XStr::make() to accept impl Into<Box<str>> for both parameters (was
&str only) so callers can pass an already-owned String/Box<str> without an
extra allocation; existing &str call sites are unaffected since &str already
implements Into<Box<str>>.

Renamed Ref::into_inner/XStr::into_inner to into_parts (they return a tuple
of fields, unlike the single-Box<str> into_inner on Str/Uri/Symbol), added
Ref::from_parts as the inverse constructor, and added tests for
into_parts/from_parts and their round-trip on Ref, plus into_parts on XStr.

Validated with cargo build --all-targets, cargo test --all-targets (331
passed), cargo test --doc (131 passed), and cargo clippy --all-targets (clean).
@github-actions

Copy link
Copy Markdown

Coverage after merging feat/improve-apis into master will be

82.33%

Coverage Report for Changed Files
FileStmtsBranchesFuncsLinesUncovered Lines
src/c_api
   str.rs0%100%0%0%35–39, 41, 43–44, 69–74, 76, 78, 80–81, 89, 92–93
   symbol.rs0%100%0%0%35–39, 41, 43–44, 68–73, 75, 77, 79–80
   uri.rs0%100%0%0%35–39, 41, 43–44, 69–74, 76, 78, 80–81
src/haystack/defs
   containment_refs.rs94.19%100%93.10%94.34%103, 121, 146–147, 224, 248, 265, 284, 313, 98
   misc.rs0%100%0%0%17–28
   namespace.rs92.83%100%98.94%91.79%239, 256, 334, 353, 386, 399, 411, 413, 415, 430, 485, 536, 678, 683, 686, 721, 737–756, 785, 790, 883, 904
src/haystack/encoding/brio
   decode.rs90.93%100%90.82%90.95%162–164, 180, 203, 254, 268–270, 274, 284–286, 295–297, 301, 309–311, 320–322, 327, 34–35, 352–354, 36, 369, 37, 383–389, 39, 391, 395–401, 403, 407–412, 414, 45–47, 49, 499–501, 51
   encode.rs98.40%100%97.37%98.54%462, 60–62, 64, 70–72
src/haystack/encoding/json
   decode.rs74.35%100%64.86%75.65%109–111, 124–144, 204, 21–24, 26, 276, 279, 28, 315, 325, 338, 345, 35, 355, 36, 363, 37–38, 382, 40, 416, 42, 422, 424, 433, 47–50, 52, 54, 65–68, 70, 89–92, 94
   encode.rs88.52%100%90%88.34%164–166, 168–169, 171–174, 22–23, 239, 24–29, 98
src/haystack/encoding/trio
   decode.rs96.12%100%95.89%96.16%119, 164–165, 17–19, 210–214, 247, 420, 794, 799
   encode.rs95.40%100%93.33%95.69%73–75, 88–93
src/haystack/encoding/zinc
   encode.rs87.02%100%83.33%87.50%142, 144–145, 147, 149, 182, 237, 240–241, 243, 259, 287, 404, 68–70, 72, 78–80, 84–86, 90–92, 96–98
src/haystack/encoding/zinc/decode
   id.rs96.92%100%90%98.18%
   value.rs100%100%100%100%
src/haystack/encoding/zinc/decode/complex
   grid.rs93.68%100%92.59%93.75%166, 181, 184–185, 192–194, 216–217, 225–227, 292–295, 337, 531, 570, 604
src/haystack/encoding/zinc/decode/scalar
   reference.rs95.74%100%75%97.67%
   str.rs89%100%87.50%89.13%52, 56–57, 60, 73–74, 82–83, 86
   symbol.rs90.91%100%75%93.10%26
   uri.rs93.10%100%75%94.44%35–36
   xstr.rs100%100%100%100%
src/haystack/filter
   lexer.rs97.44%100%100%97.28%131–133, 137, 200–203, 211–213, 272, 856
   nodes.rs82.14%100%89.19%80.75%126, 153–155, 205, 323–325, 335, 337, 340, 342, 344–351, 353, 355, 357–360, 362, 366–367, 377–379, 420–422
src/haystack/timezone
   iana.rs52%100%51.28%52.21%100–101, 104–106, 109–111, 114–116, 120–122, 126, 128–129, 131, 134, 136–137, 139, 142–144, 150–152, 159–162, 167–170, 175–177, 201–203, 207–209, 213–215, 223–224, 227, 239, 33–35, 84–86, 89–91, 94–96, 99
src/haystack/val
   dict.rs92.46%100%92.80%92.39%236–238, 316–318, 325–327, 404–406, 408–410, 412–414, 515–517, 533, 540–542, 661, 694
   dis_macro.rs97.67%100%100%97.27%50–52
   reference.rs89.77%100%90%89.71%144–146, 155, 97–99
   string.rs97.62%100%100%96.92%110, 121
   symbol.rs97.62%100%100%96.97%83
   uri.rs97.37%100%100%96.67%81
   xstr.rs96.55%100%100%95.65%65

@rracariu
rracariu merged commit a64ce9f into master Sep 10, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants